package com.atguigu.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;


/***
 * @Aspect:告诉Spring当前类是一个切面类-
 */
@Aspect
public class LogAspects {
    //抽取公共的切入点表达式
    //1.本类引用
    //2.其他的切面引用
    @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")
    public void pointCut(){}

    //Before在目标方法之前切入:切入点表达式(指定在哪个方法)
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();//目标方法运行的参数表
        System.out.println("before  "+joinPoint.getSignature().getName()+"运行..参数列表是{"+ Arrays.asList(args)+"}");
    }

    //引用其他类的形式,这里引用的本类,但是LogAspects换成其他类名就是引用其他类的切入点表达式
    @After("com.atguigu.aop.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println("after  "+joinPoint.getSignature().getName()+"结束....");
    }

    //JoinPoint这个参数要写一定要出现在参数表的第一位
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(JoinPoint joinPoint,Object result){
        System.out.println("return  "+joinPoint.getSignature().getName()+"正常返回....运行结果:{"+result+"}");
    }

    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logException(JoinPoint joinPoint,Exception exception){
        System.out.println("throwing  "+joinPoint.getSignature().getName()+"异常....异常信息{"+exception+"}");
    }

}
